\section{实验结果与比较}\label{numerical experiments}
本章将首先介绍实验环境，接着从结果质量等方面对深度学习特征点、匹配算法的效果以及引入前者方法后三维重建的效果进行评估。评估内容包括重建效果与指标计算。
% //TODO 特征点提取、匹配速度
\subsection{实验环境}

本实验所使用的开发环境和主要依赖包参数分别如表\ref*{tb:env1}和表\ref*{tb:env2}所示。本文的python环境统一使用anaconda管理，整体环境使用Docker打包。方便在不同设备进行迁移。


\begin{table}[h] \xiaowu %h表示三线表在当前位置插入
    \renewcommand{\arraystretch}{1.5}
    \setlength{\tabcolsep}{10pt} % Default value: 6pt
    \setlength{\abovecaptionskip}{0.05cm} %设置三线表标题与第一条线间距
    \centering
    \caption{软件环境} 
    %表头文本加黑，但不加黑Table 1.字样，引入包即可：\usepackage[labelfont=bf]{caption}
    % \arrayrulecolor{black} %设置三线表线条颜色：黑色
    \begin{tabular}{cccc}
        \toprule
        类型 & 名称 & 版本/型号 & 说明  \\
        \midrule
        操作系统 & Manjaro & v21.2.6.1 & ArchLinux的发行版之一 \\
        显卡 & NVIDIA & Geforce RTX 3080 & cuda11.6,10G显存 \\
        开发语言 & Python/C++ & python:3.10.4/c++11 & 以Python为主 \\
        深度学习框架 & Pytorch &v1.9.1 & \makecell*[c]{深度学习框架，\\主要用于Superpoint\\Superglue的推理、训练代码的编写} \\
        点云可视化 & Meshlab & v2022.02 & 开源的点云模型可视化软件 \\
        IDE & VSCode & Version 1.67  & 可以配置多种开发环境的IDE \\
        版本控制 & Git & v2.35.1 &  开源分布式版本控制工具 \\
        C++库 & Colmap & Latest &  SFM+MVS库 \\
        C++库 & OpenMVS & Latest &  MVS库 \\
        C++库 & OpenMVG & Latest &  SFM库 \\
        \bottomrule
     \end{tabular}\label{tb:env1}
\end{table}


\begin{table}[h] \xiaowu %h表示三线表在当前位置插入
    \renewcommand{\arraystretch}{1.5}
    \setlength{\tabcolsep}{10pt} % Default value: 6pt
    \setlength{\abovecaptionskip}{0.05cm} %设置三线表标题与第一条线间距
    \centering
    \caption{第三方库依赖} 
    %表头文本加黑，但不加黑Table 1.字样，引入包即可：\usepackage[labelfont=bf]{caption}
    % \arrayrulecolor{black} %设置三线表线条颜色：黑色
    \begin{tabular}{ccc}
        \toprule
        名称 & 版本 & 说明  \\
        \midrule
        Pytorch-gpu &v1.9.1 & Pytorch的GPU版本 \\
        opencv-python & v4.4.0 & python图像处理库   \\
        matplotlib & v3.2.2 & 主要用来绘图   \\
        scipy & v1.5.4 &python科学计算库  \\
        h5py & v3.1.0 & 主要用于读写二进制文件，效果较好 \\
        torchvision & v0.10.1+cu102 & pytorch视觉方面的库  \\
        \bottomrule
     \end{tabular}\label{tb:env2}
\end{table}
\subsection{数据集}
由于目前关于室内全景图点云重建的数据集较为缺少，难以进行参考，考虑到本实验的全景图在进行E2P转化之后为透视图，因此本文选择使用透视图数据集用以计算各项指标，本文选取
ETH3D\cite{schops2017multi}数据集作为实验对象，并使用一组自己采集的全景图数据集来验证实际场景下的可行性。

ETH3D\cite{schops2017multi}数据集是由ETH开源的benchmark。包括了SLAM与MVS两个方向的数据集，涵盖了低分辨率与高分辨率、视频与图像多个种类的数据。
MVS Benchmark包括了13组带有GroundTruth的训练集与12组测试集，其场景包括室内与室外，提供相机参数等各项数据，具有较高的质量，并且为研究者提供了丰富的
工具用于评测、处理图像。图\ref{fig:dataset_overview}展示了ETH3D\cite{schops2017multi}中的一些场景视角。

\begin{figure}[H]
    \centering
    \includegraphics[width=0.9\textwidth]{figures/dataset_overview.png}
    \caption{ETH3D\cite{schops2017multi}数据集中的部分场景原始图片}
    \label{fig:dataset_overview}
\end{figure}

\subsection{Superpoint实验结果}\label{sec:sp}
首先测试了深度学习特征点与传统特征点在室内场景下的特征提取能力。这里选择了经典的SIFT特征点算法作为对比，结果如图\ref{fig:sift_sp}，其中图\ref*{fig:sift_feat}为Superpoint特征点，图\ref*{fig:sp_feat}为Sift特征点。

\begin{figure}[H]
    \centering
    \subfigure[Superpoint]{
        \includegraphics[width=0.8\textwidth]{figures/faet_sum_sift.png}
    \label{fig:sift_feat}
    }
    \subfigure[Sift]{ 
        \includegraphics[width=0.8\textwidth]{figures/faet_sum_sp.png}
        \label{fig:sp_feat}
        }
    \caption{特征点提取实验结果}
    \label{fig:sift_sp}
\end{figure}

从图片结果中可以明显发现Superpoint的特征点提取更加规律且密集，图片中左上角标注了图片特征点数量，左下角标注了图片名称。
将特征点的计算时间与空间占用也进行了统计,评估指标包括运行时间t(s),内存占用Mem(MiB),结果如表\ref{table:exp_sp_sift}。

\begin{table}[h] \xiaowu %h表示三线表在当前位置插入
    \renewcommand{\arraystretch}{1.5}
    \setlength{\tabcolsep}{10pt} % Default value: 6pt
    \setlength{\abovecaptionskip}{0.05cm} %设置三线表标题与第一条线间距
    \centering
    \caption{Superpoint与SIFT比较实验} 
    \begin{tabular}{*{7}{c}}
        \toprule
        \multirow{2}*{方法} & \multicolumn{2}{c}{delivery area} & \multicolumn{2}{c}{kicker} & \multicolumn{2}{c}{terrains}\\
        \cmidrule(lr){2-3}\cmidrule(lr){4-5}\cmidrule(lr){6-7}&t&Mem&t&Mem&t&Mem\\
        \midrule
        SIFT&13.039&120.00&9.374&75.61&11.715&75.45\\
        Superpoint(cpu)&13.465&650.05&9.533&486.62&12.502&490.28\\
        \bottomrule
      \end{tabular}
      \label{table:exp_sp_sift}
\end{table}
% Superpoint(cuda)&1.401&/&1.024&/&1.280&/\\
从上述表格中可以发现,计算设备相同的情况下，Superpoint的资源占用是大过SIFT的，运算时间与SIFT相似。在实际的使用中，可以使用cuda加速，运算时间缩减到cpu计算时间的十分之一。
\subsection{Superglue实验结果}

为了测试Superglue的匹配性能，本文选择了Sift+nn、Superpoint+nn、Superpoint+Superglue三种方案
(由于sift与superglue的描述子维度不同没有进行sift+superglue的试验)进行对比试验，
其结果如图\ref{fig:comapre_sg}，其中图\label{fig:sift_nn}为sift+nn算法，图\label{fig:sp_nn}为suerpoint+nn,图\label{fig:sp_sg}为superpoint+superglue。
\ref{sec:sp}节中已经论证了superpoint在所选择的两组室内环境图片的效果要优于Sift,而当特征点都为Superpoint时，从实验结果可以看出，Superglue的匹配效果要优于NN算法。NN算法的匹配存在较多误匹配，这一点在图片中走廊区域规则的地板特征点的匹配效果可以看出。造成图\ref*{fig:sift_nn}与图\ref*{fig:sp_nn}结果的差异是因为sift算法在弱纹理区域
提取的特征点缺少一致性，同一点在左图中出现在右图中可能不会出现，因此其匹配效果较差。而造成图\ref*{fig:sp_nn}与图\ref*{fig:sp_sg}的差异的原因是nn在进行匹配时并不会考虑特征点
在全局的信息，在弱纹理环境中提取到的特征点在局部可能高度相似，都为较弱的纹理，因此nn算法丢失了一些匹配。而Superglue不仅考虑到了局部信息，也考虑到了全局信息，因此获得的匹配对更加丰富。
\begin{figure}[H]
    \centering
    \subfigure[Sift+NN]{
    \includegraphics[width=0.8\textwidth]{figures/sift_nnDSC_1117.png_DSC_1118.png}
    \label{fig:sift_nn}
    }
    \subfigure[Superpoint+NN]{ 
        \includegraphics[width=0.8\textwidth]{figures/sp_nnDSC_1117.png_DSC_1118.png}
        }\label{fig:sp_nn}
    \subfigure[Superpoint+Suerglue]{
        \includegraphics[width=0.8\textwidth]{figures/sp_sgDSC_1117.png_DSC_1118.png}
        \label{fig:sp_sg}
        }
    \caption{Superglue与NN算法效果比较}
    \label{fig:comapre_sg}
\end{figure}


另一方面,对Superglue与NN算法的运行时间t(s)、内存占用Mem(MiB)进行了比较(如表\ref{table:exp_sg_nn})。

\begin{table}[h] \xiaowu %h表示三线表在当前位置插入
    \renewcommand{\arraystretch}{1.5}
    \setlength{\tabcolsep}{10pt} % Default value: 6pt
    \setlength{\abovecaptionskip}{0.05cm} %设置三线表标题与第一条线间距
    \centering
    \caption{Superglue与nn比较实验} 
    \begin{tabular}{*{7}{c}}
        \toprule
        \multirow{2}*{方法} & \multicolumn{2}{c}{delivery area} & \multicolumn{2}{c}{kicker} & \multicolumn{2}{c}{terrains}\\
        \cmidrule(lr){2-3}\cmidrule(lr){4-5}\cmidrule(lr){6-7}&t&Mem&t&Mem&t&Mem\\
        \midrule
        NN&7.997&3.44&3.874&1.89&7.674&0.93\\
        Superglue(cuda)&58.077 &/&26.711&/&49.533&/\\
        Superglue(cpu)&853.340&648.58 &614.355 &485.639&790.717&489.344\\
        \bottomrule
      \end{tabular}
      \label{table:exp_sg_nn}
\end{table}

从上述实验结果中可以看到Superglue由于采用了transformer的机制,使用了大量参数,在运行速度和内存消耗上都比较大,而NN每次只需要进行基本的运算,
其时间消耗与内存占用都比较小。在GPU的加速下Superglue速度仍然无法达到NN的水平,这是其缺陷。



\subsection{三维重建评估}
\subsubsection{重建效果}
首先从ETH3D\cite{schops2017multi}中选取一组测试图片进行重建以观测其效果。原始图片如图\ref{fig:oldcomp}
\begin{figure}[H]
    \centering
    \begin{minipage}[t]{0.3\linewidth}
        \centering
        \includegraphics[width=0.9\textwidth]{figures/old_computer1.png}
        \end{minipage}
        \begin{minipage}[t]{0.3\linewidth}
            \centering
            \includegraphics[width=0.9\textwidth]{figures/old_computer2.png}
            \end{minipage}
            \begin{minipage}[t]{0.3\linewidth}
                \centering
                \includegraphics[width=0.9\textwidth]{figures/old_computer3.png}
                \end{minipage}
    \caption{ETH3D\cite{schops2017multi}测试集old\_computer}
    \label{fig:oldcomp}
\end{figure}

选择了三种方法作为比较标准：Superpoint+Superglue+Colmap（本文方法）、Colmap、Colmap+MVSNet。后两种方法分别代表了传统方法、端到端深度学习方法。
MVSNet选择作者的原始权重进行预测，
其结果如图\ref{fig:depthinit1}。

\begin{figure}[H]
    \centering
    \subfigure[Superpoint+Suerglue]{
        \begin{minipage}[t]{0.3\linewidth}
        \centering
        \includegraphics[height=0.2\textheight]{figures/sp_sum.png}
        \end{minipage}
        }
    \centering
    \subfigure[Colmap]{
    \begin{minipage}[t]{0.3\linewidth}
    \centering
    \includegraphics[height=0.2\textheight]{figures/colmap_sum.png}
    \end{minipage}
    }
        \centering
        \subfigure[Colmap+MVSNet]{
        \begin{minipage}[t]{0.3\linewidth}
        \centering
        \includegraphics[height=0.2\textheight]{figures/MVSNet1.png}
        \end{minipage}
        }
        \centering
        \caption{各类方法的比较}\label{fig:depthinit1}
\end{figure}

从图片中可以看到本文的方法相比于Colmap具有一定的提升，在重建的完整度上有优势。三种方法相比较下MVSNet的效果较差，这是因为原始权重在训练过程中缺少对室内
场景的训练，导致泛化性较差。这也暴露了端到端深度学习三维重建的缺陷。

\subsubsection{指标计算} 
% // TODO 加上openMVS的
本节选取了ETH3D\cite{schops2017multi}中的三组带有Ground Truth(GT)的数据，GT是通过激光雷达进行扫描得到的。
由于从上一节的实验效果来看，MVSNet泛化性能不足，输出点云过于稀疏，难以与GT进行配准，不具备参考价值，因此分别选用Superpoint+Superglue+Colmap（本文方法）、Colmap
进行了实验。将结果输入到cloudcompare进行误差计算。couldcompare（图\ref{cloudcomapre}）是一款开源的点云比较软件，功能强大，可以评估并优化点云，图中白色为GT,其他颜色为输出点云，右侧色条显示了不同颜色代表的误差程度。

\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{figures/cloud_compare.png}
    \caption{Cloudcompare下的重建结果}
    \label{cloudcomapre}
\end{figure}

需要评估的指标主要包括点云的精度以及丰富程度，具体指标如下：

\begin{itemize}[leftmargin=4em]
    \item \textbf{平均距离(mean distance/MD)：} 计算输出结果与点云距离的平均值，反映了点云的精度
    \item \textbf{标准差(std deviation/SD)：} 计算输出结果与点云距离的标准差，反映了整体点云的分布情况
    \item \textbf{点云数量(PointNum/PN)：} 输出结果与点云的点数的比较，反映了重建的丰富程度。
\end{itemize}

以上结果均结果保留两位有效数字。

\begin{table}[h] \xiaowu %h表示三线表在当前位置插入
    \renewcommand{\arraystretch}{1.5}
    \setlength{\tabcolsep}{10pt} % Default value: 6pt
    \setlength{\abovecaptionskip}{0.05cm} %设置三线表标题与第一条线间距
    \centering
    \caption{各项指标计算结果} 
    \begin{tabular}{*{10}{c}}
        \toprule
        \multirow{2}*{方法} & \multicolumn{3}{c}{delivery area} & \multicolumn{3}{c}{kicker} & \multicolumn{3}{c}{terrains}\\
        \cmidrule(lr){2-4}\cmidrule(lr){5-7}\cmidrule(lr){8-10}
        & MD & SD & PN & MD & SD & PN&MD & SD & PN \\
        \midrule
        本文方法&  \textbf{0.66} & \textbf{0.67} & 689458 & \textbf{0.030} & \textbf{0.081} & 292743 & \textbf{0.27} &\textbf{0.82} & 633151\\
        Colmap & 2.50 & 1.56 & 689458 & 0.42 & 0.24 & 320391 & 0.63 & 1.77 & 613128 \\
       GT & / & / & 15585634 & / & / & 22423524/ & / &/ & 16751658\\
        \bottomrule
      \end{tabular}
      \label{table:exp}
\end{table}

上述结果中MD与SD越小表明重建效果越好，PN越大表明重建效果越好。为了直观的表现上述表格的结果，导出其中一组的误差直方图。

\begin{figure}[H]
    \centering
    \subfigure[本文方法的误差分布]{
    \begin{minipage}[t]{0.45\linewidth}
    \centering
    \includegraphics[width=0.9\textwidth]{figures/sp_histogram.png}
    \end{minipage}
    }
    \subfigure[Colmap的误差分布]{
        \begin{minipage}[t]{0.45\linewidth}
        \centering
        \includegraphics[width=0.9\textwidth]{figures/colmap_histogram.png}
        \end{minipage}
        }
    \caption{误差直方图}
    \label{histo}
\end{figure}

从表\ref{table:exp}中平均误差来看，本文的方法在精度上相比于Colmap具有提升。在不同场景中提升幅度不一，这与深度学习模块在不同场景下的泛化性有关。

在误差分布方面，选取了delivery area数据集的误差分布来直观的分析两种方法的效果（参考图\ref{histo}）。结合图\ref{histo}和表\ref{table:exp}中标准差的数据来分析，本文的方法在误差分布方面相对集中。
即本方法产生的点云整体上更贴和GT。

在点云数量上，两种方法相对于激光雷达采集的真值仍然具有较大的差距，本文方法
点云数量接近于Colmap,是由于二者使用了相同的MVS算法。这也是本文后续改进方向之一。最后展示上述实验的点云效果与深度估计效果，如图\ref{fig:exp_coma}，其中左侧为深度图，中间为对应的原图，右侧为重建点云。。

\begin{figure}[htbp]
    \centering
    \subfigure[delivery area重建结果演示]{
    \centering
    \includegraphics[width=0.8\textwidth]{figures/delivery_area/da.png}
    }
    \subfigure[kicker重建结果演示]{
        \centering
        \includegraphics[width=0.8\textwidth]{figures/kicker/kicker.png}
    }
    \subfigure[terrains重建结果演示]{
            \centering
            \includegraphics[width=0.8\textwidth]{figures/terrains/ter.png}
    }
    \caption{ETH3D部分数据重建结果}
    \label{fig:exp_coma}
\end{figure}
\subsection{真实场景实验}
\subsubsection{数据集}

本文实际使用的相机是影石OneX全景相机。其输出图像分辨率为6080$\times$3040。选择场景为某机房，机房内白色场景居多。一共拍摄五十余张全景图。
\subsubsection{E2P全景图转换}
根据\ref{sec:e2p}节，本文实现了E2P算法。在实际实验中参数设置如下：

\begin{table}[h] \xiaowu %h表示三线表在当前位置插入
    \renewcommand{\arraystretch}{1.5}
    \setlength{\tabcolsep}{10pt} % Default value: 6pt
    \setlength{\abovecaptionskip}{0.05cm} %设置三线表标题与第一条线间距
    \centering
    \caption{参数设置} 
    %表头文本加黑，但不加黑Table 1.字样，引入包即可：\usepackage[labelfont=bf]{caption}
    % \arrayrulecolor{black} %设置三线表线条颜色：黑色
    \begin{tabular}{cccc}
        \toprule
        类型 & 大小 & 单位 & 说明  \\
        \midrule
        FOV & 60 & 度 & 该大小视角在实验中表现最佳\\
        视图划分 & 4 & / & 四个视图舍弃了顶部和底部畸变较大的区域 \\
        图片大小 & 1024*1024 & / & 过大的图片会导致深度学习模块显存、内存溢出\\
        \bottomrule
    \label{tb:e2p}
     \end{tabular}
\end{table}

最终输出图像如图\ref{fig:e2p_result}，上图为E2P转化后的透视图，下图为原始图像(缩放后)。

\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{figures/e2p.png}
    \includegraphics[width=0.8\textwidth]{figures/e2p_raw.jpg}
    \caption{E2P转换结果}
    \label{fig:e2p_result}
\end{figure}

通过E2P变换，一张全景图可以产生四个视角，同时也为每张图片计算出了内参矩阵（如式\ref{equ:matrix}），很大程度上丰富了数据集。另外，本文选取的这一场景具有大面积的白色墙壁，比较具有挑战性。
在生成图片之后，由于拍摄者会对重建产生影响，本文采用人体识别标记出有人体干扰的图片，并将其滤去（没有使用mask的原因是人体占图片比例
普遍较大使用mask后产生的噪声大过这张图片的信息，效果反而下降了），最终得到177张图片。由此可以证明全景图具备丰富的信息，可以产生充足视角。

\begin{equation}\label{equ:matrix}
    K=\begin{pmatrix}
        296.605&0&512\\
        0&296.605&512\\
        0&0&1
    \end{pmatrix}
\end{equation}

\subsubsection{全景图三维重建}

将变换后的透视图输入到重建的pipeline中，可以得到一个室内的三维模型如图\ref*{actual_sum}。

\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{figures/actual_sum.png}
    \caption{真实场景下的全景图室内重建效果}
    \label{actual_sum}
\end{figure}

从结果中发现以下几个现象：

\begin{itemize}[leftmargin=4em]
    \item 对于室内白色的墙壁基本完成重建，但是存在一些噪声。证明了本文方法的有效性；
    \item 屋顶和地板出现了空洞，这是由于表\ref{tb:e2p}中所提到的，本文将每张全景图只分解为了四个视角，因为顶部与底部失真较大，这导致顶部与底部的信息不足；
    \item 受制于疫情因素的影响，该数据集是委托机房工人；
    拍摄，拍摄质量难以控制（比如图片中会出现拍摄者，图片抖动导致模糊等，具体可参考图\ref{fig:e2p_result}），这导致重建效果受到影响。
\end{itemize}

\subsection{本章小结}

本章首先对选用的深度学习特征点提取匹配算法进行了评测，从结果可以看出在室内弱纹理区域深度学习方法质量提升明显。证明了本文方法的有效性。随后分别对三维重建效果与结果的各项指标进行了评估。
在重建效果的评估中，选用了Colmap、MVSNet分别代表了传统算法、深度学习算法进行了比较。本文方法相比于Colmap在弱纹理区域有所提升，重建出了Colmap没有重建的区域，而MVSNet由于泛化性问题则重建失败。
在各项指标的评估中，由于MVSNet的重建失败无法计算精度，所以只与Colmap进行了比较。在大多数场景本文方法都获得了精度上的提高。
最后将本算法应用到实际的室内全景图数据集中，证明了方案的可行性。